/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda.dao;

import agenda.bean.Contato;
import agenda.bean.Tabela;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Antonio
 */
public class ContatoDAO {
    private Connection conn;
    private PesquisaDAO daoPesquisa;

    public ContatoDAO() {
        conn = Conexao.getInstance();
        daoPesquisa = new PesquisaDAO();
    }

    // insert
    public boolean insert(Contato c) {
        String sql = "insert into contato (id, nome, datanascimento, endereco, cidade) "
                   + " values (nextval('seq_contato'), ?, ?, ?, ?) returning id";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, c.getNome());
            ps.setDate(2, new Date(c.getDataNascimento().getTime()));
            ps.setString(3, c.getEndereco());
            ps.setInt(4, c.getCidade().getId());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                c.setId(rs.getInt("id"));
                rs.close();
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return false;
    }

    // update
    public boolean update(Contato c) {
        String sql = "update contato set nome = ?, datanascimento = ?, endereco = ?, cidade = ? where id = ?";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, c.getNome());
            ps.setDate(2, new Date(c.getDataNascimento().getTime()));
            ps.setString(3, c.getEndereco());
            ps.setObject(4, c.getCidade().getId());
            ps.setObject(5, c.getId());
            if (ps.executeUpdate() > 0) {
                return true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return false;
    }

    // delete
    public boolean delete(Integer id) {
        String sql = "delete from contato where id = ?";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setObject(1, id);
            if (ps.executeUpdate() > 0) {
                return true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return false;
    }

    // select
    public List<Contato> select(String filtro) {
        if (filtro == null || filtro.trim().isEmpty()) {
            filtro = "1 = 1";
        }
        String sql = "select * from contato where " + filtro;
        try {
            ResultSet rs = conn.createStatement().executeQuery(sql);
            List<Contato> contatos = new ArrayList<Contato>();
            while (rs.next()) {
                Contato c = new Contato();
                c.setId(rs.getInt("id"));
                c.setNome(rs.getString("nome"));
                c.setDataNascimento(new java.util.Date(rs.getDate("datanascimento").getTime()));
                c.setEndereco(rs.getString("endereco"));
                c.getCidade().setId(rs.getInt("cidade"));
                contatos.add(c);
            }
            rs.close();
            return contatos;
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return null;
    }

    public String getSqlPesquisa() {
        String sql = "select c.id as \"ID\",      "
                   + "       c.nome as \"Nome\",  "
                   + "       c.datanascimento as \"Data Nascimento\", "
                   + "       c.endereco as \"Endereço\",              "
                   + "       cid.nome as \"Cidade\"                   "
                   + "  from contato c                                "
                   + "  left join cidade cid on c.cidade = cid.id     "
                   + " where upper(c.nome || '%' || c.endereco) like upper(?)  "
                   + " order by c.nome";
        return sql;
    }

    public Tabela pesquisar(String coluna, String texto) {
        String sql = "Select * from ("
                   + "Select cast(con.id as text) as \"ID\",         "
                   + "       con.nome as \"Nome\",     "
                   + "       to_char(con.datanascimento, 'dd/MM/yyyy') as \"Nascimento\",    "
                   + "       con.endereco as \"Endereço\",            "
                   + "       cid.nome || '-' || cid.uf as \"Cidade\", "
                   + "       tel.numero as \"Telefone\",              "
                   + "       tel.descricao as \"Descrição\"           "
                   + "  from contato con"
                   + "  left join cidade cid on cid.id = con.cidade"
                   + "  left join telefone tel on con.id = tel.contato"
                   + ") temp "
                   + " where upper(" + coluna + ") like ?"
                   + " order by \"Nome\", \"Telefone\" ";
        String parametro = texto.toUpperCase().trim().replace(" ", "%");
        return daoPesquisa.executaConsulta(sql, parametro);
    }


}


















